<?php 

class ocorrencia_searchModel extends Model{
    
    private $ignore = array();
    public function __construct() {
        parent::__construct();
        $this->LoadModel('usuario/login', 'uobj');
        $this->LoadModel('search/alg', 'alg');
        $this->ignore = $this->alg->getIgnoredWords();
    }

    private $results_por_pagina = 10;
    public function search($search, $filtros, $page = 0, $filtro = "all"){
        
        $search = trim($search);
        $search = $this->alg->removePlural($search);
        if($search == "") return array();
        unset($filtros['q']);
        $var = array();
        
        if(!$this->uobj->UserIsAdmin()) unset($filtros['usuario_usuario']);
        foreach($_GET as $name => $value) $_POST[$name] = $value;
        
        $this->set_default_filthers($filtros);
        $search_fields = array('assunto' => "", 'descricao' => "", 'status_label' => "", 'texto' => "");
        if(array_key_exists("ocorrencia_campos", $filtros) && $filtros["ocorrencia_campos"] != "all"){
            if(array_key_exists($filtros["ocorrencia_campos"], $search_fields))
                $search_fields = array($filtros["ocorrencia_campos"] => "");
        }
        
        $exp = explode(' ', $search);
        $g = $o = $m = $or = $u = "";
        $i = 0;
        $buscar = $tempOc = $tempM = array();
        foreach($exp as $e){
            $e = trim($e);
            //if($i == 4) break;
            if(in_array($e, $this->ignore) || $e == "") continue;
            if(array_key_exists($e, $buscar)) continue;
            $buscar[$e] = '';
            $e = htmlentities($e, ENT_QUOTES);
            if(array_key_exists('assunto', $search_fields))     $tempOc[] = "assunto LIKE '%$e%'";
            if(array_key_exists('descricao', $search_fields))   $tempOc[] = "descricao LIKE '%$e%'";
            if(array_key_exists('status_label', $search_fields))$tempOc[] = "status_label LIKE '%$e%'";
            if(array_key_exists('texto', $search_fields))       $tempM[] = "texto LIKE '%$e%'";
        }
        $o = implode(" OR ", $tempOc);
        $m = implode(" OR ", $tempM);
        
        //die($m);
        $array = array('all', 'oc', 'msg');
        if(!in_array($filtro, $array)) $filtro = 'all';
        if($filtro == "oc"  || $filtro == "all"){
            $var["Assuntos"]['lista'] = $this->ocorrencia_ocorrencias($o, $filtros, $page);
            $var["Assuntos"]['model'] = 'ocorrencia/ocorrencias'; 
        }
        if($filtro == "msg" || $filtro == "all"){
            $var["Mensagens"]['lista'] = $this->ocorrencia_mensagem($m, $filtros, $page);
            $var["Mensagens"]['model'] = 'ocorrencia/mensagem'; 
        }
        foreach($var as $name => $arr){
            if(empty ($arr['lista'])) unset($var[$name]);
        }
        return $var;
    }
    
    private function set_default_filthers(&$filtros) {
        
        if(array_key_exists('plugin', $filtros)){
            $plug = explode("-", $filtros['plugin']);
            $_POST['plugin'] = array();
            foreach($plug as $p) $_POST['plugin'][] = $p;
            //debugarray($_POST['plugin']); die();
        }
        
        //verfica o filtro de grupos
        $this->LoadModel('ocorrencia/grupo', 'obj');
        $list = $this->obj->getListOfAccess();
        $list = implode(", ", $list);
        if(array_key_exists('ocorrencia_grupo', $filtros) && $filtros['ocorrencia_grupo'] != 'all'){
             $list = $filtros['ocorrencia_grupo'];
             $_POST['ocorrencia_grupo'] = $list;
        }else $filtros['ocorrencia_grupo'] = "all";
        
        //verifica o filtro de usuários
        if(!isset($filtros['usuario_usuario'])) $filtros['usuario_usuario'] = "participo";
        
        //verifica os filtros de data
        if(array_key_exists('data_inicio', $filtros)){
            if(!timeResource::isValidDate($filtros['data_inicio'])) unset($filtros['data_inicio'] );
        }
        if(array_key_exists('data_fim', $filtros)){
            if(!timeResource::isValidDate($filtros['data_fim'])) unset($filtros['data_fim'] );
        }
    }
    
    private function ocorrencia_ocorrencias($o, $filtros, $page) {
        
        if($o == "") return array();
        $where = $this->get_filtros_ocorrencias($filtros);
        $where = ($where == "")?$o: "$where AND ($o) ";
        if($where == "")return "";
        
        $this->LoadResource('html/paginator', 'pg');
        $this->LoadModel('ocorrencia/ocorrencias', 'obj');
        $array = array('DISTINCT ocorrencia_ocorrencias.cod_ocorrencia', 'assunto', 'descricao as Mensagem', 'status_label','tipo','criadoem', 'encerradoem');
        
        $this->pg->setWhere($where);
        $this->pg->setJoin($this->db->getJoin());
        
        $url = $this->getPage("index/oc");
        $this->pg->Paginacao($this->obj->getTable(), $url."&page=", $this->results_por_pagina, $page);
        //$this->pg->startDebug();
        $var = $this->pg->selecionar($this->obj, $array, $where, "");
        return $var;
    }
    
    private function ocorrencia_mensagem($m, $filtros, $page) {

        if($m == "") return "";
        //$where = $this->get_filtros_ocorrencias($filtros);
        //$where = ($where == "")?$m: "$where AND ($m) ";
        $where = $m;
        $this->LoadResource('html', 'html');
        $this->LoadResource('html/paginator', 'pg');
        
        $this->LoadModel('ocorrencia/ocorrencias', 'oc');
        $this->LoadModel('ocorrencia/mensagem', 'obj');
        
        $and = ($where != "")?" AND ":"";
        if(array_key_exists('data_inicio', $filtros) && array_key_exists('data_fim', $filtros)){
           $where .= "$and (data >= '".$filtros['data_inicio']."' AND data <= '".$filtros['data_fim']."')";
        }
        elseif(array_key_exists('data_inicio', $filtros)) $where .= " $and data >= '".$filtros['data_inicio']."'";
        elseif(array_key_exists('data_fim', $filtros))    $where .= " $and data <= '".$filtros['data_fim']."'";
        
        $oc_table  = $this->oc->getTable();
        $table_msg = $this->obj->getTable();
        $array = array("DISTINCT ($oc_table.cod_ocorrencia)", "$table_msg.cod_mensagem",'assunto', 'status_label', 'tipo', 
            'criadoem', 'encerradoem', 'texto');
        $this->db->Join($table_msg, $oc_table);
        $join = $this->db->getJoin(); 
        if(!$this->uobj->UserIsAdmin() || $filtros['usuario_usuario'] != 'all'){
            $this->LoadModel('ocorrencia/envolvido', 'eobj');
            $this->db->Join($oc_table, $this->eobj->getTable(), array('cod_ocorrencia'), array('cod_ocorrencia'), "LEFT");
            $join = "$join " . $this->db->getJoin(); 
            if($this->uobj->UserIsAdmin() && $filtros['usuario_usuario'] != 'participo'){
                $cod_user = $filtros['usuario_usuario'];
            }else $cod_user = $this->uobj->getCodUsuario();
            $we = "cod_usuario='$cod_user'";
            $where = ($where == "")?$we:"$we AND ($where)";
        }
        if($where == "")return "";
        
        if(!array_key_exists('ocorrencia_mensagem', $filtros) || $filtros['ocorrencia_mensagem'] == 's'){
            $where .= " GROUP BY $oc_table.cod_ocorrencia";
        }
        
        $this->db->setJoin($join);
        $this->pg->setDados(array("DISTINCT ($oc_table.cod_ocorrencia)"));
        $this->pg->setWhere($where);
        $this->pg->setJoin($this->db->getJoin());
        
        $url = $this->getPage("index/msg");
        $this->pg->Paginacao($this->obj->getTable(), $url."&page=", $this->results_por_pagina, $page);
        //$this->pg->startDebug();
        $var = $this->pg->selecionar($this->obj, $array, $where, NULL);
        return $var;
    }
    
    private function getPage($link=""){
        $url = URL . "index.php?url=".LINK."/$link";
        if(isset($_GET['q'])){
            $q = $_GET['q'];
            unset($_GET['q']);
            $_GET['q'] = $q;
        }
        foreach($_GET as $name => $value){
            if($name == "page" || $name == "url") continue;
            $url .= "&$name=$value";
        }
        return $url;
    }
    
    private function get_filtros_ocorrencias($filtros){
        
        static $savedfilter = "";
        if($savedfilter != "")return $savedfilter;
        
        $where = "";        
        if(!$this->uobj->UserIsAdmin() || $filtros['usuario_usuario'] != 'all'){
            $this->LoadModel('ocorrencia/ocorrencias', 'oobj');
            $this->LoadModel('ocorrencia/envolvido', 'eobj');
            $this->db->Join($this->oobj->getTable(), $this->eobj->getTable(), array('cod_ocorrencia'), array('cod_ocorrencia'), "LEFT");
            $join = $this->db->getJoin();
            if($this->uobj->UserIsAdmin() && $filtros['usuario_usuario'] != 'participo')
                 $cod_user = $filtros['usuario_usuario'];
            else $cod_user = $this->uobj->getCodUsuario();
            $this->db->setJoin($join);
            $we = "cod_usuario='$cod_user'";
            $where = ($where == "")?$we:"$we AND ($where)";
        }

        $and = ($where != "") ?" AND ":"";
        if(array_key_exists('data_inicio', $filtros) && array_key_exists('data_fim', $filtros)&&
        $filtros['data_inicio'] != "" && $filtros['data_fim'] != ""){
            $filtros['data_inicio'] = convertData($filtros['data_inicio']);
            $filtros['data_fim'] = convertData($filtros['data_fim']);
            //$_POST['data_inicio'] = $filtros['data_inicio'];
            //$_POST['data_fim'] = $filtros['data_fim'];
            $where .= " $and ((criadoem >= '".$filtros['data_inicio']."' AND criadoem <= '".$filtros['data_fim']."') OR ";
            $where .= " (encerradoem >= '".$filtros['data_inicio']."' AND encerradoem <= '".$filtros['data_fim']."') OR ";
            $where .= " (previsao_encerramento >= '".$filtros['data_inicio']."' AND previsao_encerramento <= '".$filtros['data_fim']."')) ";
        }elseif(array_key_exists('data_inicio', $filtros) && $filtros['data_inicio'] != ""){
            $filtros['data_inicio'] = convertData($filtros['data_inicio']);
            //$_POST['data_inicio'] = $filtros['data_inicio'];
            $where .= " $and criadoem >= '".$filtros['data_inicio']."' OR ";
            $where .= " encerradoem >= '".$filtros['data_inicio']."' OR ";
            $where .= " previsao_encerramento >= '".$filtros['data_inicio']."' ";
        }
        elseif(array_key_exists('data_fim', $filtros) && $filtros['data_fim'] != ""){
            $filtros['data_fim'] = convertData($filtros['data_fim']);
            //$_POST['data_fim'] = $filtros['data_fim'];
            $where .= "$and criadoem <= '".$filtros['data_fim']."' OR ";
            $where .= "encerradoem <= '".$filtros['data_fim']."' OR ";
            $where .= "previsao_encerramento <= '".$filtros['data_fim']."'";
        }

        if(array_key_exists('ocorrencia_grupo', $filtros) && $filtros['ocorrencia_grupo'] != 'all'){
             $query = "grupo='".$filtros['ocorrencia_grupo']."'";
             $where = ($where == "")? $query:" $query AND ( $where )";
        }

        if(array_key_exists('ocorrencia_status', $filtros) && $filtros['ocorrencia_status'] != 'all'){
            //$_POST['ocorrencia_ocorrencias'] = $filtros['ocorrencia_status'];
            $query = "";
            switch ($filtros['ocorrencia_status']){
                case 'andamento':
                    $query = "tipo = 'andamento'";
                    break;
                case 'atraso':
                    $query = "(previsao_encerramento < NOW() AND previsao_encerramento != '0000-00-00') AND (tipo = 'andamento' OR tipo = 'paralisado') AND tipo != 'excluido'";
                    break;
                case 'solicitadas':
                    $cod = $this->uobj->getCodUsuario();
                    $query = "tipo != 'excluido' AND criado_por = '$cod'";
                    break;
                case 'lixeira':
                    $query = "tipo = 'excluido'";
                    break;
                case 'cancelado':
                    $query = "tipo = 'cancelado'";
                    break;
                case 'paralisado':
                    $query = "tipo = 'paralisado'";
                    break;
                case 'concluido':
                    $query = "tipo = 'concluido'";
                    break;
            }
            $where = ($where == "")? $query:" $query AND ( $where )";
        }
        $savedfilter = $where;
        return $savedfilter;
    }
    
    public function RefineForm(){
        
        $this->LoadClassFromPlugin('ocorrencia/search/searchformModel', "sfm");
        $form = $this->sfm->getForm();
        $this->LoadResource('formulario', 'form');
        $this->form->printable();
        $var  = "<h3>Filtrar Resultados</h3>";
        $var .= $this->form->NewForm($form, array(), array(), false);
        EventTube::addEvent("menu-lateral", $var);
    }
    
}
?>